package utils

import (
	"context"
	"fmt"

	"github.com/golang-jwt/jwt/v4"
)

// GetUserInfoFromContext 从上下文中获取用户ID和角色
func GetUserInfoFromContext(ctx context.Context) (int64, string, error) {
	// 1. 首先尝试从"userInfo"键获取用户信息
	userInfoValue := ctx.Value("userInfo")
	if userInfoValue != nil {
		if userInfo, ok := userInfoValue.(map[string]interface{}); ok {
			// 获取用户ID
			if id, exists := userInfo["id"]; exists {
				var userId int64
				if idFloat, ok := id.(float64); ok {
					userId = int64(idFloat)
				} else if idInt, ok := id.(int64); ok {
					userId = idInt
				} else {
					return 0, "", fmt.Errorf("无效的用户ID类型")
				}
				
				// 获取用户角色
				role := "user" // 默认为普通用户
				if roleValue, exists := userInfo["role"]; exists {
					if roleStr, ok := roleValue.(string); ok {
						role = roleStr
					}
				}
				
				return userId, role, nil
			}
		}
	}

	// 2. 尝试从"claims"键获取
	claimsValue := ctx.Value("claims")
	if claimsValue != nil {
		// 尝试断言为jwt.MapClaims
		if claims, ok := claimsValue.(jwt.MapClaims); ok {
			// 获取用户ID
			if id, exists := claims["id"]; exists {
				var userId int64
				if idFloat, ok := id.(float64); ok {
					userId = int64(idFloat)
				} else if idInt, ok := id.(int64); ok {
					userId = idInt
				} else {
					return 0, "", fmt.Errorf("无效的用户ID类型")
				}
				
				// 获取用户角色
				role := "user" // 默认为普通用户
				if roleValue, exists := claims["role"]; exists {
					if roleStr, ok := roleValue.(string); ok {
						role = roleStr
					}
				}
				
				return userId, role, nil
			}
		}
		
		// 尝试断言为map[string]interface{}
		if claims, ok := claimsValue.(map[string]interface{}); ok {
			// 获取用户ID
			if id, exists := claims["id"]; exists {
				var userId int64
				if idFloat, ok := id.(float64); ok {
					userId = int64(idFloat)
				} else if idInt, ok := id.(int64); ok {
					userId = idInt
				} else {
					return 0, "", fmt.Errorf("无效的用户ID类型")
				}
				
				// 获取用户角色
				role := "user" // 默认为普通用户
				if roleValue, exists := claims["role"]; exists {
					if roleStr, ok := roleValue.(string); ok {
						role = roleStr
					}
				}
				
				return userId, role, nil
			}
		}
	}

	// 如果都没有找到，返回错误
	return 0, "", fmt.Errorf("未授权：无法从上下文中获取用户信息")
}

// IsAdmin 检查用户是否是管理员
func IsAdmin(ctx context.Context) bool {
	_, role, err := GetUserInfoFromContext(ctx)
	if err != nil {
		return false
	}
	return role == "admin"
}